package com.tqz.juc.synchronizeds;

import org.openjdk.jol.info.ClassLayout;

import java.util.concurrent.TimeUnit;

/**
 * <p>
 *
 *
 * @author tianqingzhao
 * @since 2022/1/18 23:03
 */
public class T0_ObjectSize {

    public static void main(String[] args) throws InterruptedException {
        TimeUnit.SECONDS.sleep(5);
        Object o = new Object();
        
        // sleep之前 00000001 00000000 00000000 00000000 四个八位要反过来，没有hashcode 的原因是懒加载
        
        // sleep之后 00000101 00000000 00000000 00000000 匿名偏向，可偏向状态。
        // 但是这里没有线程的id，意思就是没有任何人加锁，预先做准备，可以进行偏向。
        
        System.out.println(ClassLayout.parseInstance(o).toPrintable());
        
        synchronized (o){
            // (11001000 11110000 00100101 00000011)
            // 这里单个线程竟然是轻量级锁，原因是jvm启动的时候内部会开启一些线程，
            // 为了避免锁的升级，所以这里直接使用了轻量级锁，而非偏向锁。延迟5毫秒即可
            
            // 01111000 11110010 10100100 00000010
            // 一旦进入同步代码块之后，就有偏向哪个线程的记录了
            System.out.println(ClassLayout.parseInstance(o).toPrintable());
        }
    }
}
